package other;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @Author: 梁二东
 * @Date: 2024/11/27 19:43
 * @Description:
 **/
/*
我们来帮两个老板解决怎么安排会议的问题：
张老板和李老板决定在 10:00~20:00 时间之间安排一个会议，希望会议时长 1 小时，下面是两个人已有的会议安排：
张老板：10:00~11:00, 13:00~14:30, 16:00~19:00
李老板：10:15~12:30, 13:30~14:30, 19:00~20:00

请帮忙找出两个人都空闲可以安排时间段，并打印出来给两个人选择。请用你熟悉的语言来实现。
*/
class TimeSlot {
    int start; // 以分钟为单位的开始时间
    int end;   // 以分钟为单位的结束时间

    TimeSlot(int start, int end) {
        this.start = start;
        this.end = end;
    }

    // 检查两个时间段是否有重叠
    boolean overlaps(TimeSlot other) {
        return this.start < other.end && other.start < this.end;
    }
}

public class MeetingScheduler {
    public static void main(String[] args) {
        // 定义时间段
        TimeSlot workingHours = new TimeSlot(600, 1200); // 10:00 ~ 20:00
        List<TimeSlot> zhangMeetings = Stream.of(
                new TimeSlot(600, 660), // 10:00 ~ 11:00
                new TimeSlot(780, 870), // 13:00 ~ 14:30
                new TimeSlot(960, 1140) // 16:00 ~ 19:00
        ).collect(Collectors.toList());
        List<TimeSlot> liMeetings = Stream.of(
                new TimeSlot(615, 750), // 10:15 ~ 12:30
                new TimeSlot(810, 870), // 13:30 ~ 14:30
                new TimeSlot(1140, 1200) // 19:00 ~ 20:00
        ).collect(Collectors.toList());

        // 合并两位老板的会议时间
        List<TimeSlot> allMeetings = new ArrayList<>(zhangMeetings);
        allMeetings.addAll(liMeetings);

        // 找到可用的时间段
        List<TimeSlot> availableSlots = findAvailableSlots(workingHours, allMeetings, 60);

        // 输出可用时间段
        if (availableSlots.isEmpty()) {
            System.out.println("没有可用的会议时间。");
        } else {
            System.out.println("可用的会议时间：");
            for (TimeSlot slot : availableSlots) {
                System.out.printf("%02d:%02d ~ %02d:%02d\n", slot.start / 60, slot.start % 60, slot.end / 60, slot.end % 60);
            }
        }
    }

    private static List<TimeSlot> findAvailableSlots(TimeSlot workingHours, List<TimeSlot> meetings, int meetingDuration) {
        List<TimeSlot> availableSlots = new ArrayList<>();
        int lastEnd = workingHours.start;

        // 按时间排序会议
        meetings.sort((a, b) -> Integer.compare(a.start, b.start));

        for (TimeSlot meeting : meetings) {
            // 检查工作时间内的空闲时间
            if (meeting.start > lastEnd) {
                // 如果有空闲时间，检查是否足够安排会议
                if (meeting.start - lastEnd >= meetingDuration) {
                    //availableSlots.add(new TimeSlot(lastEnd, lastEnd + meetingDuration));
                    availableSlots.add(new TimeSlot(lastEnd, meeting.start));
                }
            }
            // 更新最后结束时间
            lastEnd = Math.max(lastEnd, meeting.end);
        }

        // 检查工作时间结束后的空闲时间
        if (workingHours.end - lastEnd >= meetingDuration) {
            availableSlots.add(new TimeSlot(lastEnd, lastEnd + meetingDuration));
        }

        return availableSlots;
    }
}


//public class MeetingScheduler {
//
//    public static void main(String[] args) {
//        List<Double[]> meeting = meeting();
//        System.out.println(meeting);
//    }
//    public static List<Double[]> meeting() {
//        double[][] mz = {{11,13},{14.5,16}};
//        double[][] ml = {{12.5,13.5},{14.5,19}};
//        List<Double[]> result = new ArrayList<>();
//        for(int i=0; i<mz.length; i++) {
//            double[] mzkx = mz[i];
//            double[] mlkx = ml[i];
//            double minkxstart = Math.max(mzkx[0], mlkx[0]);
//            double minkxend = Math.min(mzkx[1], mlkx[1]);
//            if (minkxend - minkxstart >= 1.0) {
//                Double[] kx = {minkxstart, minkxend};
//                result.add(kx);
//            }
//        }
//        return result;
//    }
//}
